#!/bin/bash

###############################################################################
# Spring Boot 应用停止脚本
# 项目名称: enterprise-portal
###############################################################################

# 应用配置
APP_NAME="enterprise-portal"
APP_PORT=8091

# 获取脚本所在目录
cd "$(dirname "$0")" || exit 1
BASE_DIR=$(pwd)
PID_FILE="$BASE_DIR/$APP_NAME.pid"

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

print_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

print_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查PID文件是否存在
if [ ! -f "$PID_FILE" ]; then
    print_warn "未找到PID文件: $PID_FILE"

    # 尝试通过端口查找进程
    print_info "尝试通过端口 $APP_PORT 查找进程..."
    PID=$(lsof -ti:$APP_PORT 2>/dev/null || fuser $APP_PORT/tcp 2>/dev/null | awk '{print $1}')

    if [ -z "$PID" ]; then
        print_error "未找到运行中的应用进程"
        exit 1
    fi

    print_info "通过端口找到进程 PID: $PID"
else
    PID=$(cat "$PID_FILE")
    print_info "从PID文件读取到 PID: $PID"
fi

# 检查进程是否存在
if ! ps -p "$PID" > /dev/null 2>&1; then
    print_warn "进程 $PID 不存在，可能已经停止"
    rm -f "$PID_FILE"
    exit 0
fi

# 优雅停止应用
print_info "正在停止应用 (PID: $PID)..."
kill "$PID"

# 等待应用停止（最多等待30秒）
COUNT=0
MAX_COUNT=30

while [ $COUNT -lt $MAX_COUNT ]; do
    if ! ps -p "$PID" > /dev/null 2>&1; then
        print_info "应用已成功停止"
        rm -f "$PID_FILE"
        exit 0
    fi

    sleep 1
    COUNT=$((COUNT + 1))

    # 每5秒显示一次进度
    if [ $((COUNT % 5)) -eq 0 ]; then
        print_info "等待应用停止... ($COUNT/$MAX_COUNT)"
    fi
done

# 如果优雅停止失败，强制杀死进程
print_warn "优雅停止超时，正在强制停止..."
kill -9 "$PID"

sleep 2

if ps -p "$PID" > /dev/null 2>&1; then
    print_error "强制停止失败！"
    exit 1
else
    print_info "应用已强制停止"
    rm -f "$PID_FILE"
    exit 0
fi
